package com.bruip.apring.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author 王若龙
 * @CreateTime 2022-09-01 13:59
 */
public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * ClassLoader loader: 指定加载动态生成的代理类的类加载器
     * Class<?>[] interfaces：获取目标对象实现的所有接口的class对象的数组
     * InvocationHandler h：设置代理类中代理方法该如何重写
     *
     * @return
     */
    public Object getProxy() {

        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler handler = (proxy, method, args) -> {

            Object result = null;
            try {
                System.out.println("日志， 方法：" + method.getName() + ", 参数：" + Arrays.toString(args));

                result = method.invoke(target, args);

                System.out.println("日志， 方法：" + method.getName() + ", 结果：" + result);

            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("日志，方法：" + method.getName() + ", 异常：" + e);

            } finally {
                System.out.println("日志，方法：" + method.getName() + ", 方法执行完毕");
            }

            return result;
        };

        return Proxy.newProxyInstance(classLoader, interfaces, handler);
    }
}
